package medOffice;


/**
 * Constroi um plano de saude.
 * 
 * @author F. Demontie dos Santos Junior</br> <b>Matricula:</b> 20911084
 * @version 1.0, 01 de dezembro de 2009
 */
public class PlanoDeSaude implements Comparable<PlanoDeSaude> {

	private String nome, telefone;
	private int codigo;
	private double valorConsulta, valorRetorno;
	
	/**
	 * Construtor default da classe.
	 */
	public PlanoDeSaude() {
		
	}
	
	/**
	 * Construtor da classe apenas com o codigo do plano de saude.
	 * @param int codigo do plano
	 * @throws Exception lancada caso o codigo seja invalido
	 */
	public PlanoDeSaude(int codigo) throws Exception {
		setCodigo(codigo);
		
	}
	
	/**
	 * Construtor da classe.
	 * @param String nome do plano
	 * @throws Exception lancada caso nao passe nos testes do verificador.
	 */
	public PlanoDeSaude(String nome) throws Exception {
		setNomeDoPlano(nome);
	}
	
	/**
	 * Construtor da classe.
	 * @param String nome
	 * @param inteiro codigo
	 * @throws Exception lancada caso nao passe nos testes do verificador.
	 */
	public PlanoDeSaude(String nome, int codigo) throws Exception {
		setNomeDoPlano(nome);
		setCodigo(codigo);
	}
	
	
	/**
	 * Construtor da classe
	 * @param String nome
	 * @param String telefone
	 * @param double valorConsulta
	 * @param double valorRetorno
	 * @param int codigo
	 * @throws Exception lancada caso nao passe nos testes do verificador.
	 */
	public PlanoDeSaude(String nome, String telefone, double valorConsulta,
			double valorRetorno, int codigo) throws Exception {
		setNomeDoPlano(nome);
		setTelefoneContato(telefone);
		setValorConsulta(valorConsulta);
		setValorRetorno(valorRetorno);
		setCodigo(codigo);

	}

	/**
	 * Metodo acessador que retorna o nome do plano de saude.
	 * 
	 * @return String nome do plano
	 */
	public String getNomeDoPlano() {
		return nome;
	}

	/**
	 * Metodo modificador que seta o nome do plano para o nome passado
	 * por parametro.
	 * 
	 * @param String
	 *              novo nome para o plano
	 */
	public void setNomeDoPlano(String novoNome) throws Exception {
		if (!(Verificador.verificaNome(novoNome)))
			throw new Exception("Nome invalido");
		this.nome = novoNome;
	}

	/**
	 * Metodo acessador que retorna o codigo do plano de saude.
	 * 
	 * @return int codigo do plano
	 */
	public int getCodigo() {
		return this.codigo;
	}

	/**
	 * Metodo modificador que muda o codigo do plano para o codigo passado por parametro.
	 * 
	 * @param int novo codigo para o plano
	 * @throws Exception lancada caso o codigo seja invalido 
	 */
	public void setCodigo(int novoCodigo) throws Exception {
		if (!(novoCodigo >= 0))
			throw new Exception("Codigo invalido");
		this.codigo = novoCodigo;
	}

	/**
	 *  Metodo acessador que retorna o valor de cada consulta.
	 * 
	 * @return double valor da consulta
	 */
	public double getValorConsulta() {
		return this.valorConsulta;
	}
	

	/**
	 * Metodo modificador que seta o valor da consulta para o valor passado por parametro
	 * 
	 * @param double novo valor da consulta
	 * @throws Exception caso o valor seja negativo
	 */
	public void setValorConsulta(double valor) throws Exception {
		if (!(valor >= 0))
			throw new Exception("Valor deve ser positivo");
		valorConsulta = valor;
	}

	/**
	 * Metodo acessador que retorna o numero do telefone de contato da empresa (plano de saude).
	 * 
	 * @return String telefone de contato
	 */
	public String getTelefoneContato() {
		return telefone;
	}

	/**
	 * Metodo modificador que seta o numero do telefone de contato para o passado como parametro.
	 * 
	 * @param String
	 *             novo telefone de contato
	 * @throws Exception caso o telefone seja invalido
	 */
	public void setTelefoneContato(String telefone) throws Exception {
		if (!(Verificador.verificaTelefone(telefone)))
			throw new Exception("Formatacao invalida para telefone");
		this.telefone = telefone;
	}

	/**
	 * Metodo acessador que retorna o valor pago no retorno de um paciente
	 * 
	 * @return double valor do retorno
	 */
	public double getValorRetorno() {
		return valorRetorno;
	}

	/**
	 * Metodo modificador que seta o valor do retorno para o valor passado por parametro.
	 * 
	 * @param double novo valor do retorno
	 * @throws Exception caso o valor seja menor que zero.
	 */
	public void setValorRetorno(double valorRetorno) throws Exception{
		if (!(valorRetorno >= 0))
			throw new Exception("Valor deve ser positivo");
		this.valorRetorno = valorRetorno;
	}

	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof PlanoDeSaude))
			return false;
		PlanoDeSaude outro = (PlanoDeSaude) obj;
		return this.getNomeDoPlano().equals(outro.getNomeDoPlano())
				&& this.getCodigo() == outro.getCodigo();
	}

	@Override
	public String toString() {
		return this.getNomeDoPlano();
	}

	@Override
	public int compareTo(PlanoDeSaude o) {
		return (o.getCodigo() < getCodigo()) ? -1
				: (o.getCodigo() == getCodigo()) ? 0 : 1;
	}
}